01. 概述
实战项目概述
现在,你需要一展所学,来解决 Andy 的这个直方图滤波器问题。在他的代码里,你会找到 8 个 C++ 文件。其中有 6 个包括直方图滤波器函数。其他 2 个中,一个是 main.cpp 文件,一个包含打印矩阵的一个函数。
你需要通读他的文件,运行程序,并提升他的代码的运行速度。
本项目不评分 ,我们会在“代码参考”部分提供参考答案。本项目没有严格的对错之分。我们的目标是让代码运行速度更快。代码参考展示了几种可行的优化方式。
项目文件
在本课的下一部分,你会发现一个嵌入式工作空间,它包含了以下文件和文件夹:
- andy_histogram_filter 文件夹
- optimized_code 文件夹
- instructions.md 文件
andy_histogram_filter
andy_histogram_filter 文件夹包括了 Andy 的直方图滤波器代码。其中有一个 main.cpp 文件,会运行每个直方图滤波器函数并计时。计时结果会输出至终端。
其他的 .cpp 文件含有直方图滤波器的函数定义。
optimized_code
optimized_code 同样也包括了一份 Andy 的直方图滤波器代码。你需要在这里调整并优化代码。这些文件带有注释,可以为你的优化提供灵感。
instructions.md
本文件包括完成并运行本项目的进一步说明。
hints.md
optimized_code 中的文件已经提示了如何优化。hints 文件中的提示更明确,但没有给出实际代码。你无需阅读本文件。我们建议你在阅读 hints 文件前,先自行尝试优化代码。
代码说明
以下为直方图滤波器代码工作原理的说明。
在 main.cpp 中,你会发现一个名为 grid 的向量。grid 是一个字符向量,它包括了一个二维正方形网格中的颜色值。
initialize_beliefs 函数代入 grid 字符,并为玩各种的每个正方形输出初始概率。
然后, sense 函数测量当前网格空间的颜色。测量值用于更新网格中每个空间的概率。
接下来, blur 函数使用平滑算法通过网格。
然后,概率通过 normalize 函数实现归一化。
最后,机器人移动到平面上的新位置,概率相应更新。
每个函数运行一万次。你可以在迭代变量中更改次数值。
顺序
我们建议按以下顺序完成本项目:
- 通读 instructions.md 中的指示
- 运行 andy_histogram_filter 文件夹中的代码(运行方式参见 instructions.md)
- 打开 main.cpp 并通读代码。本文件内容无需更改。注意,所有函数的运行次数相同。每个函数都使用时钟打包 (wrap)。
- 通读所有 .cpp 文件,熟悉代码。
- 优化 optimized_code 文件夹中的代码。每次优化时,都要运行代码,确认速度的确有提升。
下面是建议的文件优化顺序:
- zeros.cpp
- initialize_beliefs.cpp
- sense.cpp
- blur.cpp
- normalize.cpp
- move.cpp